package com.feiclub.subject.application.controller;


import com.alibaba.fastjson.JSON;
import com.feiclub.subject.application.convert.SubjectCategoryDTOConverter;
import com.feiclub.subject.application.dto.SubjectCategoryDTO;
import com.feiclub.subject.common.entity.Result;
import com.feiclub.subject.domain.entity.SubjectCategoryBO;
import com.feiclub.subject.domain.service.SubjectCategoryDomainService;
import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/subject/category")
@RequiredArgsConstructor
@Slf4j
public class SubjectCategoryController {

    private final SubjectCategoryDomainService subjectCategoryDomainService;

//    在此模块基本都是DTO先转BO  在domain层 BO再转 PO

    /**
     * 新增分类
     */

    @PostMapping("/add")
    public Result insertSubjectCategory(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {

        try {
//            isInfoEnabled() 是日志记录器提供的一个方法，用于检查当前日志记录器是否开启了INFO级别的日志记录。这个方法的返回值通常是一个布尔类型，表示INFO级别的日志是否可用。
//            当 log.isInfoEnabled() 返回 true 时，表示INFO级别的日志可以输出。
//            当 log.isInfoEnabled() 返回 false 时，表示INFO级别的日志被禁用。
//            这种机制可以避免不必要的字符串拼接和日志处理操作，提高代码的执行效率。
            if (log.isInfoEnabled()) {
//                日志
                log.info("SubjectCategoryController.add.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
//            断言
            Preconditions.checkNotNull(subjectCategoryDTO.getCategoryType(), "分类不能为空");
            Preconditions.checkArgument(!StringUtils.isBlank(subjectCategoryDTO.getCategoryName()), "分类名称不能为空");
            Preconditions.checkNotNull(subjectCategoryDTO.getParentId(), "分类父级id不能为空");

//            将subjectCategoryDTO  装换wei  subjectCategoryBO
            SubjectCategoryBO subjectCategoryBO
                    = SubjectCategoryDTOConverter.INSTANCE.convertDtoToCategoryBO(subjectCategoryDTO);
//            controller 调用   subjectCategoryDomainService  domain在调用 infra层
            subjectCategoryDomainService.add(subjectCategoryBO);
            return Result.success();
        } catch (Exception e) {
            log.error("SubjectCategoryController.add.error:{}", e.getMessage(), e);
            return Result.error(e.getMessage());
        }
    }

    /**
     * 查询岗位大类
     */

    @PostMapping("/queryPrimaryCategory")
    public Result<List<SubjectCategoryDTO>> queryPrimaryCategory(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
//            将传进来的subjectCategoryDTO变为subjectCategoryBO
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.
                    convertDtoToCategoryBO(subjectCategoryDTO);
//          根据 subjectCategoryBO 调用domain层的subjectCategoryDomainService 查询数据库
            List<SubjectCategoryBO> subjectCategoryBOList =
                    subjectCategoryDomainService.queryCategory(subjectCategoryBO);
//            将查询出来的subjectCategoryBOList装换成subjectCategoryBOList
            List<SubjectCategoryDTO> subjectCategoryDTOList
                    = SubjectCategoryDTOConverter.INSTANCE.converterBoToCategoryDTOList(subjectCategoryBOList);
            return Result.success(subjectCategoryDTOList);
        } catch (Exception e) {
            log.error("SubjectCategoryController.queryPrimaryCategory.error:{}", e.getMessage(), e);
            return Result.error("查询失败");
        }
    }

    /**
     * 大类下分类
     * 根据分类id查二级分类
     */
    @PostMapping("/queryCategoryByPrimary")
    public Result<List<SubjectCategoryDTO>> queryCategoryByPrimary(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
//                日志
                log.info("SubjectCategoryController.queryCategoryByPrimary.dto:{}"
                        , JSON.toJSONString(subjectCategoryDTO));
            }
//          对分类id判空 断言
            Preconditions.checkNotNull(subjectCategoryDTO.getParentId(), "分类id不能为空");

//            将subjectCategoryDTO装换成subjectCategoryBO
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.
                    convertDtoToCategoryBO(subjectCategoryDTO);
//            和查询大类共用一个方法  queryCategory方法
//            调用 domain层的 subjectCategoryDomainService queryCategory方法
            List<SubjectCategoryBO> subjectCategoryBOList =
                    subjectCategoryDomainService.queryCategory(subjectCategoryBO);
//            将查询出的 subjectCategoryBOList 装换成subjectCategoryDTOList
            List<SubjectCategoryDTO> subjectCategoryDTOList =
                    SubjectCategoryDTOConverter.INSTANCE.converterBoToCategoryDTOList(subjectCategoryBOList);

//           返回
            return Result.success(subjectCategoryDTOList);

        } catch (Exception e) {
            log.error("SubjectCategoryController.queryPrimaryCategory.error:{}", e.getMessage(), e);
            return Result.error("查询失败");
        }
    }

    /**
     * 更新分类
     */
    @PostMapping("/update")
    public Result<Boolean> update(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
//                日志
                log.info("SubjectCategoryController.update.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
//            将传进来的subjectCategoryDTO  变为subjectCategoryBO
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.
                    convertDtoToCategoryBO(subjectCategoryDTO);
//            在 把subjectCategoryBO 传到domain层 用于创建数据和建立方法 subjectCategoryDomainService.update
            Boolean result = subjectCategoryDomainService.update(subjectCategoryBO);
            return Result.success(result);
        } catch (Exception e) {
            log.error("SubjectCategoryController.update.error:{}", e.getMessage(), e);
            return Result.error("更新分类失败");
        }

    }



    /**
     * 删除分类
     */
    @PostMapping("/delete")
    public Result<Boolean> delete(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("SubjectCategoryController.delete.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
//             将传进来的subjectCategoryDTO  变为subjectCategoryBO
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.
                    convertDtoToCategoryBO(subjectCategoryDTO);

            //            在 把subjectCategoryBO 传到domain层 用于创建数据和建立方法 subjectCategoryDomainService.update

            Boolean result = subjectCategoryDomainService.delete(subjectCategoryBO);

            return Result.success(result);
        } catch (Exception e) {
            log.error("SubjectCategoryController.delete.error:{}", e.getMessage(), e);
            return Result.error("删除分类失败");
        }

    }




}
